﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Net;
using System.Xml;
using FindPackage.Biblioteca.Rastreamento.Correios.DTO;
namespace FindPackage.Biblioteca.Rastreamento.Correios
{

    public class MotorCorreios : RastreamentoAbstract
    {
        #region Variaveis
        private ListaDeRastreamento oListaDeRastreamento = null;
        private string strUrl = string.Empty;
        private string strObjetosRastreamento = string.Empty;
        private WebProxy oProxy;
        private XmlDocument oXmlRetornoRastreamento;
        private XmlNodeList oXmlNodeListObjeto, oXmlNodeListObjetoDestino;        
        private ObjetoCorreioDTO oObjetoCorreioDTO;
        private Local oCorreioLocal;
        private string sXmlRetRastreamento;
        #endregion
        public override ListaDeRastreamento Tracking(List<ObjetoRastreamentoDTO> lstObjetoRastreamentoDTO)
        {
            try
            {
                foreach (var ObjetoRastreamento in lstObjetoRastreamentoDTO)
                {
                    strObjetosRastreamento += ObjetoRastreamento.CodigoObjeto;
                }

                strUrl = string.Format(ConfigurationManager.AppSettings["URL_SERVICO_CORREIO"].ToString(),
                                       ConfigurationManager.AppSettings["USR_CORREIO"].ToString(),
                                       ConfigurationManager.AppSettings["PWD_CORREIO"].ToString(),
                                       strObjetosRastreamento).Replace("+", "&");


                oProxy = new WebProxy("10.172.128.29", 80);
                oProxy.UseDefaultCredentials = true;

                using (WebClient wbGetRastreamentoCorreio = new WebClient())
                {
                    wbGetRastreamentoCorreio.Proxy = oProxy;
                    sXmlRetRastreamento = wbGetRastreamentoCorreio.DownloadString(strUrl);
                }

                oXmlRetornoRastreamento = new XmlDocument();
                oXmlRetornoRastreamento.LoadXml(sXmlRetRastreamento);

                oListaDeRastreamento = new ListaDeRastreamento();                
                oListaDeRastreamento.olstRastreamentoCorreioDTO = new List<ObjetoCorreioDTO>();
                oXmlNodeListObjeto = oXmlRetornoRastreamento.GetElementsByTagName("objeto");
                foreach (XmlNode xmlNodeObjeto in oXmlNodeListObjeto)
                {
                    oObjetoCorreioDTO = new ObjetoCorreioDTO();
                    oObjetoCorreioDTO.NumeroObjeto = xmlNodeObjeto.FirstChild.InnerText;
                    oObjetoCorreioDTO.ListaEventoObjeto = new List<EventoObjetoCorreioDTO>();

                    foreach (XmlNode xmlEvento in xmlNodeObjeto.ChildNodes)
                    {
                        if (xmlEvento.Name == "evento")
                        {
                            oCorreioLocal = null;
                            if (xmlEvento["destino"] != null)
                            {
                                oCorreioLocal = new Local();
                                oCorreioLocal.pLocal = xmlEvento["destino"].GetElementsByTagName("local") != null ? 
                                    xmlEvento["destino"].GetElementsByTagName("local").Item(0).InnerText : "";
                                oCorreioLocal.pCodigo = xmlEvento["destino"].GetElementsByTagName("codigo") != null ? 
                                    xmlEvento["destino"].GetElementsByTagName("codigo").Item(0).InnerText : "";
                                oCorreioLocal.pCidade = xmlEvento["destino"].GetElementsByTagName("cidade") != null ? 
                                    xmlEvento["destino"].GetElementsByTagName("cidade").Item(0).InnerText : "";
                                oCorreioLocal.pBairro = xmlEvento["destino"].GetElementsByTagName("bairro") != null ? 
                                    xmlEvento["destino"].GetElementsByTagName("bairro").Item(0).InnerText : "";
                                oCorreioLocal.pUF = xmlEvento["destino"].GetElementsByTagName("uf") != null ? 
                                    xmlEvento["destino"].GetElementsByTagName("uf").Item(0).InnerText : "";
                            }                            

                            oObjetoCorreioDTO.ListaEventoObjeto.Add(new EventoObjetoCorreioDTO()
                            {
                                pTipo = xmlEvento["tipo"] != null ? xmlEvento["tipo"].InnerText : "",
                                pStatus = xmlEvento["status"] != null ? xmlEvento["status"].InnerText : "",
                                pData = xmlEvento["data"] != null ? xmlEvento["data"].InnerText : "",
                                pHora = xmlEvento["hora"] != null ? xmlEvento["hora"].InnerText : "",
                                pDescricao = xmlEvento["descricao"] != null ? xmlEvento["descricao"].InnerText : "",
                                pRecebedor = xmlEvento["recebedor"] != null ? xmlEvento["recebedor"].InnerText : "",
                                pDocumento = xmlEvento["documento"] != null ? xmlEvento["documento"].InnerText : "",
                                pComentario = xmlEvento["comentario"] != null ? xmlEvento["comentario"].InnerText : "",
                                pLocal = xmlEvento["local"] != null ? xmlEvento["local"].InnerText : "",
                                pCodigoEvento = xmlEvento["codigo"] != null ? xmlEvento["codigo"].InnerText : "",
                                pCidade = xmlEvento["cidade"] != null ? xmlEvento["cidade"].InnerText : "",
                                pUf = xmlEvento["uf"] != null ? xmlEvento["uf"].InnerText : "",
                                pSto = xmlEvento["sto"] != null ? xmlEvento["sto"].InnerText : "",
                                pDestinoLocal = oCorreioLocal != null ? oCorreioLocal : null,
                            });                            
                        }
                        
                    }
                    oListaDeRastreamento.olstRastreamentoCorreioDTO.Add(oObjetoCorreioDTO);
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }

            return oListaDeRastreamento;
        }
    }
}
